const fs = require('fs');
const path = require('path');
const logger = require('./Logger.js');
const DEB = false;

class ConfigLoader {
    constructor() {
        this.configPath = path.join(__dirname, 'static', 'appConfigs.json');
        this.config = null;
        this.debLog = DEB;
        this.loadConfig();
    }

    // 加载配置文件
    loadConfig() {
        try {
            const configData = fs.readFileSync(this.configPath, 'utf8');
            this.config = JSON.parse(configData);
        } catch (error) {
            logger.logMessage(`加载配置文件失败: ${error}`);
            // 如果加载失败，使用默认配置
            this.config = {
                ttAppId: '',
                ttSecret: '',
                ttGuaJiGap: 1800,
                ttContent_id: '',
                wxAppId: '',
                wxSecret: '',
                ksAppId: '',
                ksSecret: '',
                apps: {}
            };
        }
    }

    // 获取配置
    getConfig() {
        // 确保配置已加载
        if (!this.config) {
            this.loadConfig();
        }
        return this.config;
    }

    // 获取单个配置项
    get(key, defaultValue = null) {
        const config = this.getConfig();
        // 支持嵌套键，如 'apps.H5JustGoGoGoTT.AppId'
        const keys = key.split('.');
        let value = config;
        
        for (const k of keys) {
            if (value && typeof value === 'object' && k in value) {
                value = value[k];
            } else {
                return defaultValue;
            }
        }
        
        return value;
    }

    // 更新配置
    updateConfig(newConfig) {
        try {
            this.config = { ...this.config, ...newConfig };
            fs.writeFileSync(this.configPath, JSON.stringify(this.config, null, 2), 'utf8');
            logger.logMessage('配置文件已更新');
            return true;
        } catch (error) {
            logger.logMessage(`更新配置文件失败: ${error}`);
            return false;
        }
    }

    // 添加或更新应用配置
    updateAppConfig(appName, appConfig) {
        const config = this.getConfig();
        if (!config.apps) {
            config.apps = {};
        }
        
        // 检查是否是新增应用（之前不存在）
        const isNewApp = !config.apps[appName];
        const operationType = isNewApp ? '新增' : '更新';
        
        DEB && console.log(`updateAppConfig: appName=${appName}, isNewApp=${isNewApp}`);
        logger.logMessage(`${operationType}应用配置: ${appName} - AppId: ${appConfig.AppId || '未设置'}, 游戏名: ${appConfig.gameName || '未设置'}`);
        
        // 过滤掉gameName字段，确保不写入appConfigs.json
        const { gameName, ...filteredAppConfig } = appConfig;
        config.apps[appName] = { ...config.apps[appName], ...filteredAppConfig };
        
        // 如果是新增应用，创建对应的文件夹和配置文件
        if (isNewApp) {
            DEB && console.log(`开始创建文件夹和配置文件: ${appName}`);
            this.createAppFolderAndConfig(appName, appConfig);
        }
        
        // 修复：保存整个配置对象，而不是只保存apps部分，避免覆盖其他配置
        return this.updateConfig(config);
    }
    
    // 创建应用文件夹和配置文件
    createAppFolderAndConfig(appName, appConfig) {
        const fs = require('fs');
        const path = require('path');
        
        try {
            // 创建应用文件夹 - 使用项目根目录下的static文件夹
            const appFolderPath = path.join(process.cwd(), 'static', appName);
            if (!fs.existsSync(appFolderPath)) {
                fs.mkdirSync(appFolderPath, { recursive: true });
                DEB && console.log(`创建应用文件夹: ${appFolderPath}`);
            }
            
            // 创建GameConfig.json文件
            const gameConfigPath = path.join(appFolderPath, 'GameConfig.json');
            if (!fs.existsSync(gameConfigPath)) {
                // 使用SeaKingTT的GameConfig.json作为模板
                const templatePath = path.join(process.cwd(), 'static', 'SeaKingTT', 'GameConfig.json');
                let gameConfig = {
                    "canPlayerAd": 1,
                    "canplayinad": 1,
                    "debug": 0,
                    "ipu": 5,
                    "ecpm": 150,
                    "gameName": appConfig.gameName || appName,
                    "AppPackage": appName
                };
                
                // 如果模板文件存在，读取模板并修改相应字段
                if (fs.existsSync(templatePath)) {
                    const templateContent = fs.readFileSync(templatePath, 'utf8');
                    gameConfig = JSON.parse(templateContent);
                    // 修改gameName和AppPackage - 使用用户填写的游戏名，如果没有则使用应用名称
                    gameConfig.gameName = appConfig.gameName || appName;
                    gameConfig.AppPackage = appName;
                }
                
                fs.writeFileSync(gameConfigPath, JSON.stringify(gameConfig, null, 2));
                DEB && console.log(`创建GameConfig.json文件: ${gameConfigPath}`);
            }
        } catch (error) {
            console.error(`创建应用文件夹和配置文件失败: ${error.message}`);
        }
    }

    // 删除应用配置
    deleteAppConfig(appName) {
        const config = this.getConfig();
        if (config.apps && config.apps[appName]) {
            const appConfig = config.apps[appName];
            delete config.apps[appName];
            
            logger.logMessage(`删除应用配置: ${appName} - AppId: ${appConfig.AppId || '未设置'}, 游戏名: ${appConfig.gameName || '未设置'}`);
            
            const success = this.updateConfig(config);
            
            // 如果删除成功，尝试删除对应的文件夹
            if (success) {
                this.deleteAppFolder(appName);
            }
            
            return success;
        }
        return false;
    }
    
    // 删除应用文件夹
    deleteAppFolder(appName) {
        const fs = require('fs');
        const path = require('path');
        
        try {
            const appFolderPath = path.join(process.cwd(), 'static', appName);
            if (fs.existsSync(appFolderPath)) {
                // 删除文件夹及其内容
                fs.rmSync(appFolderPath, { recursive: true, force: true });
                DEB && console.log(`删除应用文件夹: ${appFolderPath}`);
            }
        } catch (error) {
            console.error(`删除应用文件夹失败: ${error.message}`);
        }
    }

    // 批量删除应用配置
    batchDeleteAppConfigs(appNames) {
        const config = this.getConfig();
        if (!config.apps) {
            return false;
        }
        
        let deletedCount = 0;
        const deletedApps = [];
        
        appNames.forEach(appName => {
            if (config.apps[appName]) {
                deletedApps.push(appName);
                delete config.apps[appName];
                deletedCount++;
            }
        });
        
        if (deletedCount > 0) {
            logger.logMessage(`批量删除应用配置: ${deletedApps.join(', ')} - 共删除 ${deletedCount} 个应用`);
            
            const success = this.updateConfig(config);
            
            // 如果删除成功，尝试删除对应的文件夹
            if (success) {
                appNames.forEach(appName => {
                    this.deleteAppFolder(appName);
                });
            }
            
            return success;
        }
        return false;
    }

    // 将配置转换为兼容旧格式的对象
    toOldFormat() {
        const config = this.getConfig();
        const oldFormat = { ...config };
        
        // 将apps中的配置合并到顶层
        if (config.apps) {
            for (const [appName, appConfig] of Object.entries(config.apps)) {
                oldFormat[appName] = appConfig;
            }
        }
        
        return oldFormat;
    }
}

module.exports = new ConfigLoader();